package com.codemeta.bokit.comm.kit;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Objects;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件工具类
 *
 * @author hice
 */
@Slf4j
public class FileKit extends FileUtil {

    /**
     * 获取项目路径
     *
     * @return .
     */
    public static String getProjectPath() {
        try {
            return new File(
                ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath()).getParentFile()
                .getParentFile().getParent();
        } catch (FileNotFoundException e) {
            log.error("获取项目所在路径异常：", e);
        }
        return null;
    }

    /**
     * 生成项目临时目录
     *
     * @param folder 创建目录
     * @return .
     */
    public static String genProjectTempFolder(String folder) {
        String path = StrUtil.blankToDefault(getProjectPath(), "");
        String filepath = StrUtil.join(File.separator, path, "temp", folder, DateUtil.today());
        if (!FileUtil.exist(filepath)) {
            FileUtil.mkdir(filepath);
        }
        return filepath;
    }

    /**
     * 获取网络图片文件base64
     *
     * @param imageUrl .
     * @return .
     */
    public static String getImageBase64(String imageUrl) {
        String mainName = FileUtil.mainName(imageUrl) + "_" + RandomUtil.randomString(6);
        String extName = "." + FileUtil.extName(imageUrl);
        String folder = genProjectTempFolder("base64");
        String temp = StrUtil.join(File.separator, folder, mainName + extName);
        File image = HttpUtil.downloadFileFromUrl(imageUrl, temp);
        return Base64.encode(image);
    }

    /**
     * 创建File对象
     *
     * @param mpFile .
     * @return .
     */
    public static File transfer(MultipartFile mpFile) {
        // 选择用缓冲区来实现这个转换即使用java 创建的临时文件 使用 MultipartFile.transferTo()方法 。
        File file = null;
        try {
            String originalFilename = mpFile.getOriginalFilename();
            String folder = genProjectTempFolder("transfer");
            file = file(folder, Objects.requireNonNull(originalFilename));
            mpFile.transferTo(file);
            file.deleteOnExit();
        } catch (IOException e) {
            log.error("spring.multipart-file转换file异常：", e);
        }
        return file;
    }
}